ls-apis should use package-manifest.toml to figure out which version of related repos to use#10220
ls-apis should use package-manifest.toml to figure out which version of related repos to use#10220davepacheco wants to merge 9 commits intomainfrom
Conversation
| Arc::into_inner(omicron).expect("no more Omicron Arc references"), | ||
| ); | ||
|
|
||
| // To load Dendrite, we need to look something up in Maghemite (loaded |
There was a problem hiding this comment.
This appears to have been totally superfluous after #7907, which added "dendrite" to the block above instead.
| [[intra_deployment_unit_only_edges]] | ||
| server = "lldpd" | ||
| client = "gateway-client" | ||
| note = """ | ||
| lldpd defaults to localhost for gateway (main.rs:194), and the SMF start | ||
| script doesn't override it. | ||
| """ | ||
| permalinks = [ | ||
| "https://github.com/oxidecomputer/lldp/blob/d22509dfdb051321b859e924948605115691b93c/lldpd/src/main.rs#L148-L154", | ||
| "https://github.com/oxidecomputer/lldp/blob/d22509dfdb051321b859e924948605115691b93c/lldpd/misc/svc-lldpd", | ||
| ] | ||
|
|
There was a problem hiding this comment.
Interestingly, I added this block as part of the PR that introduced IDU-only metadata, specifically as a result of a merge:
#9707 (comment)
What I think happened here is that:
- When I started working on ls-apis needs to detect cycles in dependency unit graph #9707, lldpd didn't depend on MGS.
- While working on it, enable lldp to be aware of what switch it is managing lldp#41 landed in the
lldprepo that added a dependency from lldpd on MGS. This happened around February 26. - There was no immediate impact on Omicron:
- To this day, package-manifest.toml in Omicron points at an lldp commit from October, 2025.
- lldpd-client is a different story. As described in pin lldp client #10361, Omicron's Cargo.toml only refers to lldpd-client coming from the lldp repo's
mainbranch, without a specific commit. However, at this point, Cargo.lock remained pinned to an earlier commit.
- Around March 2, pull in dendrite PR 220 #9898 landed, which updated Omicron's Cargo.lock so that
lldpd-clientnow came from thelldpcommit where lldpd has a dependency on MGS. package-manifest.toml was not updated. This is basically what introduced the API version mismatch that resulted in pin lldp client #10361. - When I sync'd up with that change in ls-apis needs to detect cycles in dependency unit graph #9707, I dug into this dependency, looked at lldpd
main, and added this block to the API manifest. I didn't notice the mismatch within Omicron (which is an argument for this PR). I believe this block is actually correct -- it just doesn't belong on Omicronmainyet. It will belong here once we update lldp in package-manifest.toml.
In summary: due to a combination of #10361 and the ls-apis bug that I'm fixing here, ls-apis prematurely picked up the lldp -> MGS dependency and I prematurely added this block. Fixing this bug, ls-apis no longer identifies this dependency, and the rule has to go because it's now superfluous.
| live-tests-macros = { path = "live-tests/macros" } | ||
| lldpd_client = { git = "https://github.com/oxidecomputer/lldp", package = "lldpd-client" } | ||
| lldp_protocol = { git = "https://github.com/oxidecomputer/lldp", package = "protocol" } | ||
| lldpd_client = { git = "https://github.com/oxidecomputer/lldp", rev = "61479b6922f9112fbe1e722414d2b8055212cb12", package = "lldpd-client" } |
There was a problem hiding this comment.
This is basically rolling back lldpd-client, but I believe it's correct. See #10361.
(depends on #10217)
This change causes
ls-apisto parsepackage-manifest.tomlto figure out what commits of related repos (like Crucible, Dendrite, etc.) will actually be deployed (from the current Omicron workspace). It then uses this information to choose the correct clone of the repo to use for its analysis.One other change I made here was to tie
lldpd-clientand itsprotocolpackage to the version that's deployed in package-manifest.toml. This ought to fix #10361. (A previous version of this PR updated package-manifest.toml instead, but I opted for the smaller change here.)Background
ls-apisneeds access to checked-out repos for Omicron as well as related components like Dendrite, LLDP, Crucible, Propolis, etc. It wants the versions of these repos that get deployed on real systems (based on the Omicron workspace that it's running in), since the goal is to analyze the runtime API dependencies between these components. It could create its own clones of these repos, but instead, it leverages the fact that just runningcargo metadatain Omicron requires having downloaded copies of all of these repos already. How doesls-apisfind these copies? It uses Cargo to locate a package that's known to be in that repo. Generally, it picks the package of a client that Omicron already from that repo, likedpd-clientto find Dendrite.But it's not quite so simple: Omicron can reference multiple versions of a given repo. More specifically: Omicron may reference
dpd-clientfrom multiple versions of Dendrite. This happens withdpd-clientspecifically:This is almost certainly not great. But it shouldn't cause
ls-apisto break. Right now if this happens,ls-apispicks one of these arbitrarily, which can cause it to analyze the wrong version of our software and draw wrong conclusions. This is the real cause of #10214.Again: we want
ls-apisto be looking at the version of these things that gets deployed. How can it know which one it is? The authoritative version is the one in package-manifest.toml. Hence the solution here: parse that file, find the commit being used there, and choose the version of the package that corresponds to that commit.Other notes
This is still a little cheesy in a few ways:
but I think it's a meaningful improvement.
One other note: this will break in the future if:
dpd-clientpaths above is deliberately fixed to an old version for upgrade-related reasons. This works out fine though because there's another reference todpd-clientthat is the right version.ls-apisneeds to analyze both?